;; Here is some code to initialise the firmware and save a file.
;; It is very useful for saving files when the firmware has been disabled
;; such as in a tape or disc loader.
;;
;; I do not authorise cracking or piracy of games.
;;
;; NOTE:
;;
;; 1. Firmware is not present, so we must initialise it. But, areas
;; used by firmware must be saved before the firmware is
;; initialised or the game will crash when we return to it.
;; Problem here is where do we store this data? Screen memory?
;; In the second bank of 64k?
;; 2. This code must be short if you want to replace an existing loader
;; in another program.
;; 3. If the original loader is in the range &0000-&3fff we need to
;; relocate this loader because the lower rom is switched in
;; when the firmware is initialised.
let mode=0 ;screen mode
.start_address equ &c000 ;address to put file
.km_initialise equ &bb00
.txt_output equ &bb5a
.cas_out_open equ &bc8c
.cas_out_direct equ &bc98
.cas_out_close equ &bc8f
.kl_init_back equ &bcce
.kl_l_rom_disable equ &b909
;; ** STORE DATA USED BY PROGRAM THAT WILL BE CORRUPTED BY INITIALISATION OF **
;; ** FIRMWARE **
.save_code
di
ld (stack+1),sp ;save stack used by program
ld sp,&c000 ;new stack used by firmware and load routines
;; ** INITIALISE ALTERNATE REGISTER SET FOR FIRMWARE **
exx
ld bc,&7f00+%10001000+mode ;initialise lower rom and select mode
out (c),c ;this routine must be located above &4000
exx
ex af,af'
xor a
ex af,af'
;; ** INITIALISE FIRMWARE **
call &0044 ;initialise lower jumpblock (&0000-&0040)
;and high kernal jumpblock (&b800-&bae4)
call &08bd ;initialise firmware jumpblock entries
;(&bb00- ...)
call km_initialise ;initialise keyboard manager
call kl_l_rom_disable ;disable lower rom
;; ** INITIALISE DISK ROM FOR LOADING/SAVING **
ld c,7 ;disk rom
ld de,&0040 ;lowest useable byte of memory
ld hl,&b0ff ;highest useable byte of memory
call kl_init_back ;initialise disk rom
xor a ;select drive (A)
ld (&ac00),a
ld a,&ff
ld (&be78),a ;turn of disc error messages
ld a,&c9
ld (txt_output),a ;prevent printing of text characters
;don't get error messages corrupting screen
;; ** LOAD FILE USING FIRMWARE **
ld a,(filename+9) ; this code is ideal if there is only 9 levels
inc a
ld (filename+9),a
; otherwise for many more levels use this code:
;
; ld a,(level) ; variable holding level number
; ld b,a
; and &f
; add a,&41
; ld (end_filename-1),a
; ld a,b
; and &f0
; add a,&41
; ld (end_filename-2),a
ld b,end_filename-filename ;length of filename
ld hl,filename ;address of filename in memory
ld de,start_address ;address to put file/2k buffer to use (unused since
push de ;read direct used
call cas_out_open ;open file
pop hl
ld de,file_length
ld bc,0
ld a,2 ;HL = load address, BC = length of file
call cas_out_direct ;read it
call cas_out_close ;close it
;; ** RESTORE DATA WHICH WOULD HAVE BEEN OVERWRITTEN BY FIRMWARE **
;; !!EXAMPLE!!
di
.stack ld sp,0 ;old stack back and...
ret ;...exit to program!!
.filename
defb "LEVEL.0"